package config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;

import java.lang.management.PlatformLoggingMXBean;

/**
 * @PropertySource引入配置文件
 */
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.driverClassName}")
    private String driverClassName;

    @Value("${jdbc.url}")
    private String url;

    /**
     * 实例化spring自带的数据源DriverManagerDataSource类
     * 实际开发中不要使用这个，因为它没有连接池，每次都要创建数据库连接
     * 太慢了,之所以我们要用这个是因为比较方便，一通百通，这个会了，其他的
     * 连接池也是一样的道理
     * 但是 要注意DriverManagerDataSource无法使用@Transaction注解来控制事务
     * 因为它太笨了，如果非要使用事务，请使用 环绕通知@Around注解自己控制
     * 或者换一个有连接池的数据源
     */
    @Bean
    public DriverManagerDataSource driverManagerDataSource(){
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUsername(this.username);
        driverManagerDataSource.setPassword(this.password);
        driverManagerDataSource.setDriverClassName(this.driverClassName);
        driverManagerDataSource.setUrl(this.url);
        return driverManagerDataSource;
    }

    /**
     * 实例化JdbcTemplate类，用来在dao中执行对数据库的操作
     * @param driverManagerDataSource 通过形参注入数据源
     * @return
     */
    @Bean
    public JdbcTemplate jdbcTemplate(DriverManagerDataSource driverManagerDataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(driverManagerDataSource);
        return jdbcTemplate;
    }

    /**
     * 配置事务
     * @param driverManagerDataSource
     * @return
     */
    @Bean
    public PlatformTransactionManager platformTransactionManager(DriverManagerDataSource driverManagerDataSource){
        return new DataSourceTransactionManager(driverManagerDataSource);
    }

}
